'''
函数的参数
    -位置参数 positional argument
        -位置参数必须传参
        -有多个位置参数时，按照顺序传参
    -默认参数
        -降低调用函数的难度
        -有默认值的参数，可以传参，如果不传参，则使用默认值
        -默认参数必须放在位置参数的后面
        -默认参数一般也按照顺序传参，但是也可以按照参数名进行传参
    -可变参数
        -可以接收任意数量的参数
        -通过在形参的起前面添加*，将其变为可变参数
        -在函数内部，可变参数会自动的将所有传入的参数封装为一个——元组
        -形参前面*号的作用是打包，实参前面*号的作用是拆包
    -关键字参数
        -可以接收任意数量的参数(形如：key=value)
        -通过在形参的起前面添加**，将其变为关键字参数
        -在函数内部，关键字参数会自动的将所有传入的参数封装为一个——字典
        -形参前面**号的作用是打包，实参前面**号的作用是拆包
    -命名关键字参数
        -限制关键字参数的名称
        
'''

'''位置参数'''
# 求x**2

def power(x):
    return x * x

print(power(3))
# 位置参数必须传参
# print(power())

def power2(x,n): #形式参数 - 形参
    return x**n

print(power2(3,0.5))
print(power2(2,3)) #实际参数 - 实参


'''默认参数'''
def power3(x,n=2): #形式参数 - 形参
    return x**n

print(power3(5,2))
print(power3(5))


def background(name,age,gender='男',city='西安'):
    print(name,age,gender,city)

background('黄征',23,'男','西安')
background('李智',28,'女','西安')
background('马音',32,'女','渭南')

background('任琳',18,'女')
background('王鑫',25,city='重庆',gender='女')


'''可变参数'''

# 求任意个数之和
def sum(d):
    print(d)
    s = 0
    for i in d:
        s = s+i
    return s

d = [1,2,35,7]
r = sum(d)
print('r=%d'%r)

d = [1,2,35,7,4,6,9,239]
r = sum(d)
print('r=%d'%r)


def sum2(*d):   # 打包
    print(d)
    s = 0
    for i in d:
        s = s+i
    return s

r = sum2(1,2,35,7,4,6,9,239)
print('r=%d'%r)

# r = sum2(d)
# r = sum2(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7])
r = sum2(*d) # 拆包
print('r=%d'%r)

print(d)
print(*d)


'''关键字参数'''

def f(**kw):
    print(kw)

f(name='Tom',age=23,gender='男',city='西安')

s = {'name':'Tom','age':23,'gender':'男','city':'西安'}
f(**s)


'''命名关键字参数'''
def g(*,name,age):
    print(name,age)

g(name='tom',age=23)
g(name='tom',age=23,city='西安')

# 所有的参数类型可以一起使用，但是要注意参数的顺序
def m(name,age,gender='男',*hobby,job,**education):
    print(name,age,gender,hobby,education,job)

# 下面的函数可以接收任意个数，任意类型的参数
def h(*args,**kw):
    print(args,kw)